home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / msdos / mituyama / mituyama.c next >
C/C++ Source or Header  |  1991-10-18  |  5KB  |  221 lines

  1. /************************************/
  2. /*******    三山 くずし       *******/
  3. /***  Copyright (C) 1991.H.Asano  ***/
  4. /*         programming  1991.3.21   */
  5. /************************************/
  6.  
  7. #define  locate(x,y)    printf("\x1b[%d;%dH",(x),(y))
  8.  
  9. #define  CLRLINE     "\x1b[K"
  10. #define  CLRATLIB    "\x1b[m"
  11. #define  CURSOLOFF   "\x1b[1v"
  12. #define  CURSOLON    "\x1b[0v"
  13. #define  CONTINUE    1
  14. #define  COMWIN      2
  15. #define  MANWIN      3
  16. #define  STONE_POS  17
  17.  
  18. static struct {
  19.        int su[3];                 /* 山の石の数   */
  20.        int su_info[3] ;           /* 山の印字位置 */
  21.        int iro[3];                /* 石の色       */
  22.        int get;                   /* 石を取る山   */
  23. } yama = {{0,0,0},{5,31,57},{32,33,36}};
  24.  
  25. main()
  26. {
  27.   int init(void);
  28.   int getstone(int);
  29.   void sleep(int);
  30.   int turn;
  31.   int kekka;
  32.  
  33.      turn=init();
  34.      do {
  35.        kekka=getstone(turn);
  36.        turn=!turn;
  37.        sleep(1200);
  38.      } while(kekka==CONTINUE);
  39.  
  40.      locate(6,22),printf(CLRLINE);
  41.      if(kekka == COMWIN)
  42.      printf("\x1b[5mやっぱり私が勝っただろう!\n");
  43.      else
  44.      printf("\x1b[33m珍しいこともあるものだ。君が勝つとは!!\n");
  45.      locate(21,1),printf(CLRATLIB),printf(CURSOLON);
  46.  
  47. }
  48.  
  49. int init(void)
  50. {
  51.   int get_rand(int);
  52.  
  53.   long now;
  54.   int i,j;
  55.   int x;
  56.   char turn;
  57.  
  58.      printf("\x1b*\x1b[35m");
  59.      printf("         ★★★★  不思議な  石  取  り  あ  そ  び  ★★★★\n");
  60.      printf("                  [Ver1.0]    Copyright (C) H.Asano 1991\n\n");
  61.      printf(CLRATLIB);
  62.      printf("  最後の石を取った方が勝ちだよ。多分君は私に勝てないだろうが挑戦したまえ。\n");
  63.  
  64.      srand(time(&now));
  65.      for(i=0;i<3;i++)
  66.        yama.su[i] = get_rand(75)+25;
  67.  
  68.      for(i=0;i<3;i++) {
  69.        locate(STONE_POS,yama.su_info[i]);
  70.        printf("  %c  山  %3d個", 'A'+i, yama.su[i]);
  71.  
  72.        printf("\x1b[%dm",yama.iro[i]);
  73.        x = STONE_POS - 2;
  74.        locate(x,yama.su_info[i]);
  75.        for(j=1;j<=yama.su[i];j++) {
  76.      printf("●");
  77.      if(j%10 == 0 ) locate(--x,yama.su_info[i]);
  78.        }
  79.        printf(CLRATLIB);
  80.      }
  81.  
  82.    /**** 先攻 後攻を決める *****/
  83.  
  84.      do {
  85.        locate(20,3),printf(CLRLINE);
  86.        printf("どちらが先に石を取るかい");
  87.        printf("\t0.私 \t1.君 ....... ?");
  88.      } while((turn=getch()) != '0' && turn != '1');
  89.      printf(" %c\n",turn);
  90.      return((int)(turn-'0'));
  91. }
  92.  
  93. /***** 石の取り合い ****/
  94. int getstone(int turn)
  95. {
  96.   int com(void);
  97.   int man(void);
  98.  
  99.      if(turn==0) return(com());
  100.      else        return(man());
  101.  
  102. }
  103.  
  104. /**** 私が石をとります ****/
  105. int com()
  106. {
  107.   void prtstone(int where,int save,int getsu);
  108.  
  109.   int save;
  110.   int x,y;
  111.  
  112.      locate(19,1),printf(CLRLINE);
  113.      locate(20,1),printf(CLRLINE);
  114.      locate(19,1);
  115.      printf("私の番だな。");
  116.  
  117.      if(yama.su[0] > yama.su[1] )
  118.        if(yama.su[0] > yama.su[2])  yama.get = 0;
  119.        else                         yama.get = 2;
  120.      else
  121.        if(yama.su[1] > yama.su[2])  yama.get = 1;
  122.        else                         yama.get = 2;
  123.  
  124.      save = yama.su[yama.get];
  125.  
  126.      if(!(yama.su[0] ^ yama.su[1] ^ yama.su[2]))
  127.        yama.su[yama.get]--;
  128.      else
  129.        do {
  130.      yama.su[yama.get]--;
  131.      if(yama.su[yama.get] < 0) {
  132.        yama.su[yama.get] = save;
  133.        yama.get += 1;
  134.        if(yama.get == 3) yama.get = 0;
  135.        save = yama.su[yama.get];
  136.        continue;
  137.      }
  138.        } while((yama.su[0] ^ yama.su[1] ^ yama.su[2]));
  139.  
  140.      prtstone(yama.get,save,save-yama.su[yama.get]);
  141.  
  142.     if(yama.su[0] + yama.su[1] + yama.su[2] == 0) return(COMWIN);
  143.     else                                          return(CONTINUE);
  144.  
  145. }
  146.  
  147. /**** 人間が石を取ります ****/
  148. int man()
  149. {
  150.   int save;
  151.   int getsu;
  152.   char ch;
  153.  
  154.      locate(19,1), printf(CLRLINE);
  155.      locate(20,1), printf(CLRLINE);
  156.      locate(19,1);
  157.      printf("君の番だ。");
  158.      printf(CURSOLON);
  159.  
  160.      do {
  161.        do {
  162.      locate(20,3),printf(CLRLINE);
  163.      printf("どの山から取るかい ?");
  164.        } while(((ch=getch()) <'A' || ch > 'C') && (ch < 'a' || ch > 'c')) ;
  165.        yama.get = ch-1 & 0x0f;
  166.        printf(" %c\n",yama.get+'A');
  167.        if(yama.su[yama.get] != 0) break;
  168.      } while(1);
  169.      do {
  170.        locate(20,3),printf(CLRLINE);
  171.        printf("%c 山からいくつ取るつもり (1 ~ %d)? ",
  172.          yama.get+'A', yama.su[yama.get]);
  173.        scanf("%d",&getsu);
  174.      } while(0>=getsu || getsu>yama.su[yama.get]);
  175.  
  176.      save = yama.su[yama.get];
  177.      yama.su[yama.get] -= getsu;
  178.      prtstone(yama.get, save, getsu);
  179.  
  180.      if(yama.su[0] + yama.su[1] + yama.su[2] == 0) return(MANWIN);
  181.      else                                          return(CONTINUE);
  182. }
  183.  
  184. void prtstone(int where,int save,int getsu)
  185. {
  186.  
  187.   int i;
  188.  
  189.      locate(20,3),printf(CLRLINE),printf(CURSOLOFF);
  190.      printf("%c 山から %d 個取るよ。\n",
  191.        'A'+yama.get,getsu);
  192.  
  193.      for(i=1;i<=getsu;i++) {
  194.        locate(STONE_POS-2-(save-1)/10, yama.su_info[where]+(save-1)%10*2);
  195.        printf("\a ");
  196.        locate(STONE_POS,yama.su_info[where]+9);
  197.        printf("%3d",--save);
  198.        sleep(350);
  199.      }
  200. }
  201.  
  202. void sleep(int count)
  203. {
  204.   int i,j;
  205.   int a=0;
  206.  
  207.   for(i=0;i<count;i++)
  208.     for(j=0;j<100;j++)
  209.       a=a*a*a*a;
  210. }
  211.  
  212. int get_rand(int max)
  213. {
  214.   int temp;
  215.  
  216.   do {
  217.     temp = rand() / (32767/max);
  218.   } while(temp > max);
  219.   return(temp);
  220. }
  221.